package 反射;

/*
测试反射的基本应用;;注意反射不需要main方法进行测试
 */
import org.junit.Test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;

public class TestReflect { //public void getClazz() 通过单元测试
   @Test //一、获取字节码对象
    public void getClazz() throws ClassNotFoundException {
       Class<?> student1 = Class.forName("反射.TestReflect");
       Class<?> student2 = Student.class;
       Class<? > student3 = new Student().getClass();
       System.out.println(student1);
       System.out.println(student1.getName());//class 完整类名
       System.out.println(student1.getPackage().getName());//包名
       System.out.println(student1.getSimpleName());//类名
   }
   @Test //二、获取构造方法
    public void getConstruct(){
      Class<Student> cls = Student.class;//获取字节码对象
      Constructor<?>[] con = cls.getConstructors();//获取所有构造方法,存入数组
      //采用增强for遍历
      for (Constructor c:con
           ) {
         System.out.println(c.getName());//获取名称：打印两次【包名.类名】==>两个构造方法
         Class[] types = c.getParameterTypes();//获取所有参数类型
         System.out.println(Arrays.toString(types));//查看数组：[]  [class java.lang.String, int]
      }
   }

    @Test//三、获取成员变量
    public  void getFiled(){
        Class<Student> clazz = Student.class;
        Field[] fields = clazz.getFields();//获取所有成员变量
        for (Field f:fields
             ) {
           System.out.println(f.getType().getName());//需将Student类的成员变量设置public才能获取成员变量
            System.out.println(f.getType());
        }
    }
  @Test//四、获取成员方法
    public void getMethod() {
      Class<?> clazz = Student.class;
      Method[] ms = clazz.getMethods();//获取所有成员方法
      for (Method m : ms
      ) {
          // System.out.println(m.getParameterTypes());//全是地址值
          System.out.println(m.getName());
          System.out.println(Arrays.toString(m.getParameterTypes()));//方法名
      }
    }
      @Test//五、创建对象 newInstance()
      public  void getObject() throws Exception {
//          Class<Student> clazz = Student.class;
//          Student s = clazz.newInstance();//抛出异常
//          System.out.println(s);
          Class<?> clazz = Student.class;
          Object o = clazz.newInstance();//创建无参构造
          System.out.println(o);
          //getConstructor（）获取全参构造，()指定参数格式为:基本类型.class
          Constructor<?> c = clazz.getConstructor(String.class, int.class);
          //创建全参 newInstance()
          Object o1 = c.newInstance("战一柔",25);//可赋值给全参构造
          System.out.println(o1);


          /*查看对象的具体属性和方法*/
            Student s =  (Student) o1;//o1向下强转
          System.out.println(s.age);
          System.out.println(s.name);
          s.eat();
          s.play(123);
      }

  }



